package com.dr.cmdb.core.utils;

import cn.hutool.core.lang.Validator;
import com.dr.cmdb.core.errorcode.BizCode;
import com.dr.cmdb.core.exception.BizException;

import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * @ProjectName: cmdb
 * @Package: com.dr.cmdb.application.utils
 * @Description: java类作用描述
 * @Author: duanrui
 * @CreateDate: 2021/3/25 21:13
 * @Version: 1.0
 * <p>
 * Copyright: Copyright (c) 2021
 */
public class TypeCheckUtils {

    public static void checkNum(Object val) {
        if (Validator.isNumber((CharSequence) val)) {
            throw new BizException(BizCode.FIELD_TYPE_ERROR.getCode(), BizCode.FIELD_TYPE_ERROR.getInfo() + val.toString());
        }
    }

    public static void checkIp(Object val) {
        if (Validator.isIpv4((CharSequence) val)) {
            throw new BizException(BizCode.FIELD_TYPE_ERROR.getCode(), BizCode.FIELD_TYPE_ERROR.getInfo() + val.toString());
        }
    }

    public static void checkShortChar(Object val) {

    }

    public static void checkLongChar(Object val) {

    }

    /**
     * @date:2021/3/30
     * @className:TypeCheckUtils
     * @author:duanrui
     * @description: 校验日期
     */
    public static void checkDate(Object val) {
        if (!checkDate(val, Constant.yyyyMMdd_EN)) {
            throw new BizException(BizCode.FIELD_TYPE_ERROR.getCode(), BizCode.FIELD_TYPE_ERROR.getInfo() + val.toString());
        }
    }


    /**
     * @date:2021/3/30
     * @className:TypeCheckUtils
     * @author:duanrui
     * @description: 校验时间
     */
    public static void checkTime(Object val) {
        if (!checkDate(val, Constant.yyyyMMddHHmmss_EN)) {
            throw new BizException(BizCode.FIELD_TYPE_ERROR.getCode(), BizCode.FIELD_TYPE_ERROR.getInfo() + val.toString());
        }
    }


    /**
     * 验证日期格式是否满足要求
     *
     * @param str          需要验证的日期格式
     * @param formatString 验证的标准格式，如：（yyyy/MM/dd HH:mm:ss）
     * @return 返回验证结果
     */
    private static boolean checkDate(Object str, String formatString) {
        // 指定日期格式，注意yyyy/MM/dd区分大小写；
        SimpleDateFormat format = new SimpleDateFormat(formatString);
        try {
            // 设置lenient为false.
            // 否则SimpleDateFormat会比较宽松地验证日期，比如2007/02/29会被接受，并转换成2007/03/01
            format.setLenient(false);
            format.parse((String) str);
        } catch (ParseException e) {
            // 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
            return false;
        }
        return true;
    }

}
